[이코테-그리디]_큰수의 법칙


큰수의 법칙 - My Solution

n, m, k = map(int, input().split())
arr = []

for _ in range(n):
    arr.append(int(input()))

arr.sort()
count = 0

for i in range(1, m + 1):
    if i % k == 0:
        count += arr[-2]
    else:
        count += arr[-1]

print(count)

이코테 - 풀이 1

n, m, k = map(int, input().split())
data = list(map(int, input().split()))

data.sort()
first = data[n - 1]
second = data[n - 2]

result = 0

while True:
    for i in range(k): # 가장 큰 수를 K번 더하기
        if m == 0: # m이 0이라면 반복문 탈출
            break
        result += first
        m -= 1 # 더할 때마다 1씩 빼기
    if m == 0:
        break
    result += second # 두 번째로 큰 수를 한 번 더하기
    m -= 1 # 더할 때마다 1씩 빼기

print(result)

해당 연산은 N이 10억 ~ 이상으로 올라갈 시 안좋은 효율성을 보임

이코테 - 풀이 2

n, m, k = map(int, input().split())
data = list(map(int, input().split()))

data.sort()
first = data[n - 1]
second = data[n - 2]

# 가장 큰 수가 더해지는 횟수 계산
count = int(m / (k + 1)) * k
count += m % (k + 1)

result = 0
result += (count) * first # 가장 큰 수 더하기
result += (m - count) * second # 두 번째로 큰 수 더하기

print(result)

반복되는 수열에 대해 파악해 예시로 [6,6,6,5] [6,6,6,5] 등을 구한 뒤, 해당 배열의 개수는 K+1과 짝수로 나누어 떨어지지 않을 것을 고려하여 result로 계산하였다.


Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github